clojure.core のコレクションに関する var
Clojure におけるコレクションは、clojure.lang.IPersistentCollection インタフェースを実装したインスタンス
関数
empty: 引数のコレクションと同じ型の空のコレクションを返す
code:clj
(map empty [1 2 3 '(1 2 3) {:a 1 :b 2 :c 3} #{1 2 3}]) 引数が nil の場合は nil を返す
code:clj
(empty nil) ; nil
coll?: 引数が IPersistentCollection インタフェースを実装しているか
具体的には、リストやベクタ、セット、マップの場合に true を返す
code:clj
(map coll? [ #{} {}]) ; (true true true true) empty?: 引数が空のコレクションか
code:clj
(empty? []) ; true
warning.icon シーケンス の場合は seq を使ったほうが良い seq: シーケンスが空の場合は nil を、そうでない場合はシーケンスそのものを返す
理由
empty? は (not (seq x)) で実装されているため、(empty? x) は (not (not (seq x))) となり処理が無駄
code:clj
(defn empty?
not-empty: 引数のコレクションが空であれば nil を、そうでなければ引数をそのまま返す
code:clj
(not-empty []) ; nil
引数が nil の場合も nil を返す
code:clj
(not-empty nil) ; nil
count: 引数のコレクションの要素数を返す
code:clj
(count {:a 1 :b 2}) ; 2
nilを渡すと 0 を返す
code:clj
(count nil) ; 0
文字列や配列、Java のコレクションやマップにも対応
code:clj
(count "あいうえお") ; 5
conj: コレクションに要素を追加した、新しいコレクションを返す
追加する位置はどのコレクションかによって異なる
e.g. ベクタは末尾、リストは先頭
code:clj
(conj '(1 2 3) 4) ; (4 1 2 3)
(conj #{1 2 3} 4) ; #{1 4 3 2} nil のみを渡すと nil を返すが、要素も渡すとリストとして返す
code:clj
(conj nil) ; nil
(conj nil 1) ; (1)
引数を渡さない場合、空のベクタを返す
code:clj
(conj) ; []
get: 連想配列やコレクション、文字列、配列、ILookup インタフェースを実装しているインスタンスからキーに対応する値を取得する
code:clj
(get {:a 1 :b 2} :a) ; 1
(get "foo" 0) ; \f
キーが存在しない場合は、第 3 引数で渡した値か nil を返す
code:clj
(get {:a 1 :b 2} :c) ; nil
(get {:a 1 :b 2} :c 0) ; 0
数値に使用してもエラーではなく nil を返す
code:clj
(get 1 :a) ; nil
マクロ
1 つ以上の 束縛 形式 / コレクション式の組からなるベクタを受け取り、遅延シーケンス を生成する コレクションは右から反復され、前の束縛形式で作られた束縛を参照できる
code:clj
また、:let [束縛形式 式 ...] で新しい束縛を追加したり, :while や :when でコレクションの要素を選択的に処理できる
code:clj
(* x x))
;; (0 4)